<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button>点击</button>
    <script>
        // 函数的定义
        function fn() {
            console.log("fn");
        }

        const fun = function() {
            console.log("fun");
        };
        const func = new Function('console.log("Function");');
        console.log(func instanceof Object); // true 万物皆对象

        // 函数的调用
        function test2() {
            /* 1.普通函数 */
            fn();
            fn.call();
            /* 2. 对象的方法 */
            const o = {
                sayHi: function() {
                    console.log('人生的巅峰');
                }
            };
            o.sayHi();

            /* 3. 构造函数*/
            function Star() {}

            new Star();
            /* 4. 绑定事件函数*/
            // btn.onclick = function() {}; // 点击了按钮就可以调用这个函数
            /* 5. 定时器函数*/
            setInterval(fun, 1000); // 这个函数是定时器自动1秒钟调用一次
            /* 6. 立即执行函数(自调用函数)*/
            (function() {
                console.log('人生的巅峰');
            })();
        }

        // 改变函数this指向
        function test3() {
            function fn(args1, args2) {
                // console.log(this, arguments);
                console.log(this, args1, args2);
            }

            const o = {
                name: 'o'
            };
            fn.apply(o, ['pink', 'red']);

            const arr = [33, 66, 1, 2, 7, 99, 0];
            console.log(Math.max.apply(Math, arr));
            console.log(Math.max.call(Math, 33, 66, 1, 2, 7, 99, 0));

            console.log('****************** 华丽的分割线 ******************')
            const f = fn.bind(o, 'yellow', 'purple');
            f();
            const bt = document.querySelector('button');
            /*bt.onclick = function () {
                this.disabled = true;
                setTimeout(function () {
                    bt.disabled = false;
                }, 3000);
            }*/
            bt.onclick = function() {
                this.disabled = true;
                setTimeout(function() {
                    this.disabled = false;
                }.bind(this), 3000);
                setTimeout.apply(this, [function() { // Uncaught TypeError: Illegal invocation
                    this.disabled = false;
                }, 3000]);
                setTimeout.call(this, function() { // Uncaught TypeError: Illegal invocation
                    this.disabled = false;
                }, 3000);
            };
        }
        test3();
    </script>
</body>

</html>